package com.lcke.common.config;

import com.lcke.common.login.LoginInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;


@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public LoginInterceptor getLoginInterceptor() {
        return new LoginInterceptor();
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/file/**").addResourceLocations("file:D:\\");
    }

    /**
     * 3. 跨域配置
     * 2. 已经在过滤器中实现
     * 1. @CrossOrigin
     */
    // @Override
    // public void addCorsMappings(CorsRegistry registry) {
    //     registry.addMapping("/**")
    //             .allowCredentials(true)
    //             .allowedHeaders("GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRAC")
    //             .allowedOrigins("*")
    //             .allowedMethods("*")
    //             .allowCredentials(true)
    //             .maxAge(3600);
    // }

    /**
     * 过滤器有三种注入 spring的方式
     * 1. FilterRegistrationBean
     * 2. @Component 注解过滤器（目前采用）
     * 3. @ServletComponentScan + @WebFilter
     *
     * @return
     */
    //@Bean
    //public FilterRegistrationBean<SessionFilter> filterRegistrationBean() {
    //    FilterRegistrationBean<SessionFilter> registrationBean = new FilterRegistrationBean<>(new SessionFilter());
    //    //过滤所有路径
    //    registrationBean.addUrlPatterns("/*");
    //    //添加不过滤路径
    //    registrationBean.addInitParameter("noFilter", "/one,/two");
    //    registrationBean.setName("sessionFilter");
    //    registrationBean.setOrder(1);
    //    return registrationBean;
    //}
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //所有已api开头的访问都要进入RedisSessionInterceptor拦截器进行登录验证，并排除login接口(全路径)。
        // 必须写成链式，分别设置的话会创建多个拦截器。
        //必须写成getSessionInterceptor()，否则SessionInterceptor中的@Autowired会无效
        //添加对用户是否登录的拦截器，并添加过滤项、排除项
        registry.addInterceptor(getLoginInterceptor()).addPathPatterns("/**")
                .excludePathPatterns("/favicon.ico")//favicon.ico
                .excludePathPatterns("/custom/**", "/lib/**")//静态文件
                .excludePathPatterns("/test/**","/notice/**")//临时测试
                .excludePathPatterns("/system/login", "/", "/error");//排除登录页面
    }


}